#pragma once

class CRichWriter
{
public:
	enum RichLanguage {English, Arabic};
	enum RichJust {NotSpec=-1, Left=0, Right=1, Center=2, Justified=3};
	enum FontFamily{ff_nill,ff_roman,ff_swiss,ff_modern,
		ff_script,ff_decor,ff_tech,ff_bidi};

	CRichWriter(void):ToFile(FALSE),pstr(NULL),pfile(NULL){}
	void SetTarget(CFile* pfl){ToFile=TRUE;pfile=pfl;}
	void SetTarget(CStringA* pst){ToFile=FALSE;pstr=pst;}

	virtual void StartDocument(RichLanguage Lang)=0;
	virtual void StartDocHeader(CStringA Title, CStringA Author)=0;
	virtual void StartFontTable()=0;
	virtual void AddFont(FontFamily Family, CStringA Face
		,int Charset = -1, int Codepage = -1)=0;
	virtual void EndFontTable()=0;
	virtual void StartColorTable()=0;
	virtual void AddColor(int Red, int Green, int Blue)=0;
	virtual void EndColorTable()=0;
	virtual void EndDocHeader()=0;
	virtual void StartHeader()=0;
	virtual void EndHeader()=0;
	virtual void StartFooter()=0;
	virtual void EndFooter()=0;
	virtual void AddPageNumber()=0;
	virtual void StartParagraph(RichLanguage Lang = English, RichJust Just = NotSpec)=0;
	virtual void StartFootnote()=0;
	virtual void EndFootnote()=0;
	virtual void SetLang(RichLanguage Lang)=0;
	virtual void SetFont(int n)=0;
	virtual void SetSize(int n)=0;
	virtual void SetColor(int n)=0;
	virtual void SetBold(BOOL bBold)=0;
	virtual void SetUnderline(BOOL bUnderline)=0;
	virtual void AddChar(char chr)=0;
	virtual void AddUnicodeChar(WCHAR chr)=0;
	virtual void AddTab()=0;
	virtual void AddHardSpace()=0;
	virtual void EndParagraph()=0;
	virtual void StartTable()=0;
	virtual void StartTableDef()=0;
	virtual void DefCell(int twpWidth)=0;
	virtual void EndTableDef()=0;
	virtual void StartRow()=0;
	virtual void StartCell()=0;
	virtual void EndCell()=0;
	virtual void EndRow()=0;
	virtual void EndTable()=0;
	virtual void SetPageNumber(int n)=0;
	virtual void PageAdvance()=0;
	virtual void EndDocument()=0;
	virtual ~CRichWriter(void){}
	
	void TraceState()
	{
		if(!ToFile && pstr)
			TRACE(_T("======================> Size of File: %d\r\n"), pstr->GetLength());
	}
protected:
	virtual void Write(CStringA str)
	{
		if(ToFile) pfile->Write((void*)&str,str.GetLength());
		else if(pstr)*pstr+=str;

		//TRACE(str);
	}
	virtual void Write(char chr)
	{
		if(ToFile) pfile->Write((void*)&chr,1);
		else if(pstr)*pstr+=chr;

		//TRACE(_T("%c"), chr);
	}
	BOOL ToFile;
	CStringA* pstr;
	CFile* pfile;
};
